home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / clang / ctask.zip / TSK.H < prev    next >
C/C++ Source or Header  |  1988-07-01  |  13KB  |  409 lines

  1. /*
  2.    TSK.H - CTask - Type definitions and global routine prototypes.
  3.  
  4.    Public Domain Software written by
  5.       Thomas Wagner
  6.       Patschkauer Weg 31
  7.       D-1000 Berlin 33
  8.       West Germany
  9. */
  10.  
  11.  
  12. #include "tskconf.h"
  13. #include <stdio.h>
  14.  
  15. #if defined(__TURBOC__)
  16. #include <dos.h>
  17. #define _Near
  18. #define TURBO  1
  19. #define MSC    0
  20. #else
  21. #include <dos.h>
  22. #include <conio.h>
  23. #define _Near near
  24. #define TURBO  0
  25. #define MSC    1
  26. #endif
  27.  
  28. #define local static      /* Comment out the "static" for debugging */
  29.  
  30. typedef unsigned char byte;
  31. typedef unsigned short word;
  32. typedef unsigned long dword;
  33. typedef void (cdecl far *funcptr)();
  34. typedef void far *farptr;
  35. typedef byte far *byteptr;
  36. typedef word far *wordptr;
  37.  
  38. #define TTIMEOUT ((farptr) -1L)
  39. #define TWAKE    ((farptr) -2L)
  40.  
  41. /* Task states */
  42.  
  43. #define    ST_KILLED   0
  44. #define  ST_STOPPED  1
  45. #define  ST_DELAYED  2
  46. #define  ST_WAITING  3
  47. #define  ST_ELIGIBLE 4
  48. #define  ST_RUNNING  5
  49.  
  50. /* Task flags */
  51.  
  52. #define  F_TEMP   0x80     /* Task is temporary, free on kill */
  53. #define  F_STTEMP 0x40     /* Task stack is temporary, free on kill */
  54. #define  F_CRIT   0x01     /* Task is critical, may not be preempted */
  55.  
  56. #define  FL_SYSM  0xf0     /* Mask for system flags */
  57. #define  FL_USRM  0x0f     /* Mask for user flags */
  58.  
  59. /* Timer queue element states */
  60.  
  61. #define  TSTAT_REMOVE      -1    /* Remove element from queue */
  62. #define  TSTAT_IDLE        0     /* Not in queue */
  63. #define  TSTAT_COUNTDOWN   1     /* Count down timeout, then remove */
  64. #define  TSTAT_REPEAT      2     /* Count down, reload when done */
  65.  
  66. /* Timer queue element control structure pointer kinds */
  67.  
  68. #define  TKIND_TASK        1     /* tcbptr, Wakeup associated task */
  69. #define  TKIND_WAKE        2     /* tcbptr, but not same task */
  70. #define  TKIND_PROC        3     /* call function */
  71. #define  TKIND_FLAG        4     /* flagptr, set flag */
  72. #define  TKIND_COUNTER     5     /* counterptr, increment counter */
  73.  
  74. #define  TKIND_TEMP        0x80  /* Hi bit set means temporary element */
  75.  
  76. /* Name link structure types */
  77.  
  78. #define  TYP_TCB        1
  79. #define  TYP_FLAG       2
  80. #define  TYP_RESOURCE   3
  81. #define  TYP_COUNTER    4
  82. #define  TYP_MAILBOX    5
  83. #define  TYP_PIPE       6
  84. #define  TYP_WPIPE      7
  85. #define  TYP_BUFFER     8
  86.  
  87. #define  NAMELENGTH     9  /* For structure names: 8 bytes + zero */
  88.  
  89. typedef struct name_rec far *nameptr;
  90.  
  91. struct name_rec {
  92.                 nameptr    follow;        /* Next name in list */
  93.                 nameptr    prev;          /* Previous name in list */
  94.                 farptr     strucp;        /* Top of structure pointer */
  95.                 byte       nkind;         /* Kind of structure */
  96.                 char       name [NAMELENGTH];
  97.                 };
  98.  
  99. typedef struct name_rec namerec;
  100.  
  101. typedef struct tcb_rec far *tcbptr;
  102. typedef tcbptr far *tqueptr;
  103.  
  104. typedef struct tlink_rec far *tlinkptr;
  105.  
  106. struct tlink_rec {
  107.                   tlinkptr next;
  108.                   dword    timeout;    /* Timeout counter */
  109.                   dword    reload;     /* Timeout counter reload value */
  110.                   farptr   strucp;     /* Pointer to control structure */
  111.                   byte     tstate;     /* Element state */
  112.                   byte     tkind;      /* Kind of control structure */
  113.                  };
  114.  
  115. typedef struct tlink_rec tlink;
  116.  
  117.  
  118. struct tcb_rec {
  119.                    tcbptr   next;       /* Next in queue */
  120.                    tqueptr  queue;       /* Queue head pointer */
  121.                    byteptr  stack;      /* Task stack */
  122.                    byteptr  stkbot;     /* Task stack bottom */
  123.                    word     prior;      /* Task priority */
  124.                    word     initprior;  /* Initial Task priority */
  125.                byte     state;      /* Task state */
  126.                byte     flags;      /* Task flags */
  127.                tlink    timerq;     /* Timer queue link */
  128.                farptr   retptr;     /* Event return pointer */
  129.                int      retsize;    /* Return buffer size for pipes */
  130. #if (TSK_NAMED)
  131.                namerec  name;
  132. #endif
  133.                   };
  134.  
  135. typedef struct tcb_rec tcb;
  136.  
  137. typedef struct {
  138.                tcbptr  wait_set;
  139.                tcbptr  wait_clear;
  140.                int     state;
  141. #if (TSK_DYNAMIC)
  142.                byte    flags;
  143. #endif
  144. #if (TSK_NAMED)
  145.                namerec name;
  146. #endif
  147.                } flag;
  148.  
  149. typedef flag far *flagptr;
  150.  
  151. typedef struct {
  152.                tcbptr  wait_set;
  153.                tcbptr  wait_clear;
  154.                dword   state;
  155. #if (TSK_DYNAMIC)
  156.                byte    flags;
  157. #endif
  158. #if (TSK_NAMED)
  159.                namerec name;
  160. #endif
  161.                } counter;
  162.  
  163. typedef counter far *counterptr;
  164.  
  165. typedef struct {
  166.                tcbptr   waiting;
  167.                tcbptr   owner;
  168.                int      state;
  169. #if (TSK_DYNAMIC)
  170.                byte     flags;
  171. #endif
  172. #if (TSK_NAMED)
  173.                namerec  name;
  174. #endif
  175.                } resource;
  176.  
  177. typedef resource far *resourceptr;
  178.  
  179. struct msg_header {
  180.                   struct msg_header far *next;
  181.                   };
  182.  
  183. typedef struct msg_header far *msgptr;
  184.  
  185. typedef struct {
  186.                tcbptr  waiting;
  187.                msgptr  mail_first;
  188.                msgptr  mail_last;
  189. #if (TSK_DYNAMIC)
  190.                byte    flags;
  191. #endif
  192. #if (TSK_NAMED)
  193.                namerec name;
  194. #endif
  195.                } mailbox;
  196.  
  197. typedef mailbox far *mailboxptr;
  198.  
  199. typedef struct {
  200.                tcbptr   wait_read;
  201.                tcbptr   wait_write;
  202.                tcbptr   wait_clear;
  203.                word     bufsize;
  204.                word     filled;
  205.                word     inptr;
  206.                word     outptr;
  207.                byteptr  contents;
  208. #if (TSK_DYNAMIC)
  209.                byte     flags;
  210. #endif
  211. #if (TSK_NAMED)
  212.                namerec  name;
  213. #endif
  214.                } pipe;
  215.  
  216. typedef pipe far *pipeptr;
  217.  
  218. typedef struct {
  219.                tcbptr   wait_read;
  220.                tcbptr   wait_write;
  221.                tcbptr   wait_clear;
  222.                word     bufsize;
  223.                word     filled;
  224.                word     inptr;
  225.                word     outptr;
  226.                wordptr  wcontents;
  227. #if (TSK_DYNAMIC)
  228.                byte     flags;
  229. #endif
  230. #if (TSK_NAMED)
  231.                namerec  name;
  232. #endif
  233.                } wpipe;
  234.  
  235. typedef wpipe far *wpipeptr;
  236.  
  237. typedef struct {
  238.                resource    buf_write;
  239.                resource    buf_read;
  240.                wpipe       pip;
  241.                word        msgcnt;
  242. #if (TSK_DYNAMIC)
  243.                byte    flags;
  244. #endif
  245. #if (TSK_NAMED)
  246.                namerec     name;
  247. #endif
  248.                } buffer;
  249.  
  250. typedef buffer far *bufferptr;
  251.  
  252.  
  253. extern void far install_tasker (byte varpri, int speedup);
  254. extern void far remove_tasker (void);
  255. extern void far preempt_on (void);
  256. extern void far preempt_off (void);
  257.  
  258. extern void far schedule (void);
  259. extern tcbptr far create_task (tcbptr task, funcptr func, byteptr stack,
  260.                                word stksz, word prior, farptr arg
  261. #if (TSK_NAMED)
  262.                                ,byteptr name
  263. #endif
  264.                                );
  265. extern void far kill_task (tcbptr task);
  266. extern int far start_task (tcbptr task);
  267. extern int far wake_task (tcbptr task);
  268. extern word far get_priority (tcbptr task);
  269. extern void far set_priority (tcbptr task, word prior);
  270.  
  271. extern int far t_delay (dword ticks);
  272.  
  273. extern tlinkptr far create_timer (tlinkptr elem, dword tout, farptr strucp,
  274.                                   byte kind, byte rept);
  275. extern void far delete_timer (tlinkptr elem);
  276. extern void far change_timer (tlinkptr elem, dword tout, byte rept);
  277.  
  278. extern resourceptr far create_resource (resourceptr rsc
  279. #if (TSK_NAMED)
  280.                                ,byteptr name
  281. #endif
  282.                                );
  283. extern void far delete_resource (resourceptr rsc);
  284. extern void far release_resource (resourceptr rsc);
  285. extern int far request_resource (resourceptr rsc, dword timeout);
  286. extern int far c_request_resource (resourceptr rsc);
  287. extern int far check_resource (resourceptr rsc);
  288.  
  289. extern flagptr far create_flag (flagptr flg
  290. #if (TSK_NAMED)
  291.                                ,byteptr name
  292. #endif
  293.                                );
  294. extern void far delete_flag (flagptr flg);
  295. extern void far set_flag (flagptr flg);
  296. extern void far clear_flag (flagptr flg);
  297. extern int far clear_flag_wait_set (flagptr flg, dword timeout);
  298. extern int far wait_flag_set (flagptr flg, dword timeout);
  299. extern int far wait_flag_clear (flagptr flg, dword timeout);
  300. extern int far check_flag (flagptr flg);
  301.  
  302. extern counterptr far create_counter (counterptr cnt
  303. #if (TSK_NAMED)
  304.                                ,byteptr name
  305. #endif
  306.                                );
  307. extern void far delete_counter (counterptr cnt);
  308. extern void far clear_counter (counterptr cnt);
  309. extern int far wait_counter_set (counterptr cnt, dword timeout);
  310. extern int far wait_counter_clear (counterptr cnt, dword timeout);
  311. extern void far inc_counter (counterptr cnt);
  312. extern dword far check_counter (counterptr cnt);
  313.  
  314. extern mailboxptr far create_mailbox (mailboxptr box
  315. #if (TSK_NAMED)
  316.                                ,byteptr name
  317. #endif
  318.                                );
  319. extern void far delete_mailbox (mailboxptr box);
  320. extern void far send_mail (mailboxptr box, farptr msg);
  321. extern farptr far wait_mail (mailboxptr box, dword timeout);
  322. extern farptr far c_wait_mail (mailboxptr box);
  323. extern int far check_mailbox (mailboxptr box);
  324.  
  325. extern pipeptr far create_pipe (pipeptr pip, farptr buf, word bufsize
  326. #if (TSK_NAMED)
  327.                                ,byteptr name
  328. #endif
  329.                                );
  330. extern void far delete_pipe (pipeptr pip);
  331. extern int far read_pipe (pipeptr pip, dword timeout);
  332. extern int far c_read_pipe (pipeptr pip);
  333. extern int far write_pipe (pipeptr pip, byte ch, dword timeout);
  334. extern int far c_write_pipe (pipeptr pip, byte ch);
  335. extern int far wait_pipe_empty (pipeptr pip, dword timeout);
  336. extern int far check_pipe (pipeptr pip);
  337. extern word far pipe_free (pipeptr pip);
  338.  
  339. extern wpipeptr far create_wpipe (wpipeptr pip, farptr buf, word bufsize
  340. #if (TSK_NAMED)
  341.                                ,byteptr name
  342. #endif
  343.                                );
  344. extern void far delete_wpipe (wpipeptr pip);
  345. extern word far read_wpipe (wpipeptr pip, dword timeout);
  346. extern word far c_read_wpipe (wpipeptr pip);
  347. extern int far write_wpipe (wpipeptr pip, word ch, dword timeout);
  348. extern int far c_write_wpipe (wpipeptr pip, word ch);
  349. extern int far wait_wpipe_empty (wpipeptr pip, dword timeout);
  350. extern word far check_wpipe (wpipeptr pip);
  351. extern word far wpipe_free (wpipeptr pip);
  352.  
  353. extern bufferptr far create_buffer (bufferptr buf, farptr pbuf, word bufsize
  354. #if (TSK_NAMED)
  355.                                ,byteptr name
  356. #endif
  357.                                );
  358. extern void far delete_buffer (bufferptr buf);
  359. extern int far read_buffer (bufferptr buf, farptr msg, int size, dword timeout);
  360. extern int far c_read_buffer (bufferptr buf, farptr msg, int size);
  361. extern int far write_buffer (bufferptr buf, farptr msg, int size, dword timeout);
  362. extern int far c_write_buffer (bufferptr buf, farptr msg, int size);
  363. extern word far check_buffer (bufferptr buf);
  364.  
  365. extern word far t_read_key (void);
  366. extern word far t_wait_key (dword timeout);
  367. extern word far t_keyhit (void);
  368.  
  369. extern int far  tsk_dis_int (void);
  370. extern void far tsk_ena_int (int);
  371. extern void far tsk_nop (void);
  372.  
  373. #if (TURBO)
  374. #define tsk_cli()       disable()
  375. #define tsk_sti()       enable()
  376. #define tsk_outp(p,b)   outportb(p,b)
  377. #define tsk_inp(p)      ((byte) inportb(p))
  378. #elif MSC
  379. #pragma intrinsic(_disable,_enable,outp,inp)
  380. #define tsk_cli()       _disable()
  381. #define tsk_sti()       _enable()
  382. #define tsk_outp(p,b)   outp(p,b)
  383. #define tsk_inp(p)      ((byte) inp(p))
  384.  
  385. #define MK_FP(seg,ofs)    ((farptr)(((dword)(seg) << 16) | (word)(ofs)))
  386. #else
  387. extern int far  tsk_dis_int (void);
  388. extern void far tsk_ena_int (int);
  389. extern void far tsk_cli (void);
  390. extern void far tsk_sti (void);
  391. #endif
  392.  
  393. #define CRITICAL  int crit_intsav
  394. #define C_ENTER   crit_intsav = tsk_dis_int()
  395. #define C_LEAVE   tsk_ena_int (crit_intsav)
  396.  
  397. #if (TSK_DYNAMIC)
  398. extern farptr tsk_alloc (word size);
  399. extern void tsk_free (farptr item);
  400. extern resource alloc_resource;
  401. #endif
  402.  
  403. #if (TSK_NAMED)
  404. extern farptr far find_name (byteptr name, byte kind);
  405. #endif
  406.  
  407. extern word _Near ticks_per_sec;
  408.  
  409.